<?php
namespace Home\Model;

/**
 * 实现Elasticsearch数据操作模型类
 * 注意：1、为区别于自定义model，数据库连接类方法命名采用公共函数的命名规范
 *       2、本类中只添加基础的方法，另有需要请参考Elasticsearch-PHP API
 * @author yukari
 * 2018-08-28
 */
class ElasticsearchModel{

	//数据库连接
	protected  $db_con = null;

	/**
	 * 构造函数，负责数据库的连接
	 * @author yukari
	 * 2018-06-26
	 */
	public function __construct(){
		$host = C("ES_HOST");
        $port = C("ES_PORT");

        Vendor('elasticsearch.autoload');
        //host数组可配置多个节点
        $params = array(
            $host.':'.$port
        );

        $this->db_con = \Elasticsearch\ClientBuilder::create()->setHosts($params)->build();
	} 

	/**
     * 创建索引
     * @param $params 要执行的语句，php中是多维数组
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
	public function create_index($params){

        $res = $this->db_con->indices()->create($params);
        return $res;
    }

    /**
     * 删除索引
     * @param $name 要删除的index名称
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function delete_index($name){

        $params = [
            'index' => $name
        ];

        $res = $this->db_con->indices()->delete($params);
        return $res;
    }

    /**
     * 插入单条数据
     * @param $params 要执行的语句，php中是多维数组
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function post_single_doc($params){

        $res = $this->db_con->index($params);
        return $res;

    }

    /**
     * 根据id获取文档
     * 注意：若只需要获取文档的部分内容，请单独使用对应params发起请求
     * @param $index：查询的index，$type:查询的type，$id；文档的id
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function get_doc_by_id($index,$type,$id){

        $params = [
            'index' => $index,
            'type' => $type,
            'id' => $id,
            /*
            //控制仅返回某些字段的内容
            '_source_include' => [
                'phone.lp'
            ]
            */
        ];
        $res = $this->db_con->get($params);
        return $res;
    }

    /**
     * 根据id更新文档
     * @param $params 要执行的语句，php中是多维数组
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function update_doc_by_id($params){

        $res = $this->db_con->update($params);
        return $res;
    }

    /**
     * 根据id删除文档
     * @param $index：查询的index，$type:查询的type，$id；文档的id
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function delete_doc_by_id($index,$type,$id){

        $params = [
            'index' => $index,
            'type' => $type,
            'id' => $id
        ];
        $res = $this->db_con->delete($params);
        return $res;
    }

    /**
     * 文档搜索
     * 注意：搜索的params比较复杂，请单独学习
     * @param $params 要执行的语句，php中是多维数组
     * @return 执行结果
     * @author yukari
     * 2018-08-28
     */
    public function search_doc($params){

        $res = $this->db_con->search($params);
        return $res;
    }
}